package ar.uba.fi.taller2.cmmiassistant.frontend.adaptadores.tabla;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import ar.uba.fi.taller2.cmmiassistant.controlador.Controlador;
import ar.uba.fi.taller2.cmmiassistant.modelo.evidencias.Asociacion;
import ar.uba.fi.taller2.cmmiassistant.modelo.evidencias.Evidencia;
import ar.uba.fi.taller2.cmmiassistant.observador.Observable;
import ar.uba.fi.taller2.cmmiassistant.observador.Observador;
import ar.uba.fi.taller2.cmmiassistant.observador.ServicioNotificacion;

public class TableModelAsociaciones extends TableModelBeanAdapter {

    private static final long serialVersionUID = -3705110358394627322L;

    private Controlador controlador;

    private Asociacion[] asociaciones = new Asociacion[0];

    public TableModelAsociaciones() {

        super(Asociacion.class, "idAsociacion", "tipo", "practica", "clasificacion", "comentarios");
    }

    public int getRowCount() {
        return this.getAsociaciones().length;
    }

    public Object getValueAt(int fila, int columna) {
        return this.getValueAt(this.getAsociaciones()[fila], columna);
    }

    public Asociacion getAsociacion(int fila) {
        
        return this.getAsociaciones()[fila];
    }
    
    public Asociacion[] getAsociaciones(List<Integer> filas) {
        
        List<Asociacion> seleccionadas = new ArrayList<Asociacion>();
        
        for (Integer fila : filas) {
            
            seleccionadas.add(this.getAsociacion(fila));
        }
        
        return seleccionadas.toArray(new Asociacion[seleccionadas.size()]);
    }

    protected Asociacion[] getAsociaciones() {
        return this.asociaciones;
    }

    protected void setAsociaciones(Asociacion[] asociaciones) {
        this.asociaciones = asociaciones;
    }

    protected void setAsociaciones(Collection<Asociacion> asociaciones) {

        this
                .setAsociaciones(asociaciones.toArray(new Asociacion[asociaciones
                        .size()]));
    }

    public void setControlador(Controlador controlador) {

        this.controlador = controlador;

        ServicioNotificacion.addObservador(this.getControlador().getModelo()
                .getEvidenciaSeleccionada(), this.observadorModelo);
        
        this.cargar();
    }

    private void cargar() {

        Evidencia evidencia = this.getControlador().getModelo()
        .getEvidenciaSeleccionada().getValor();

        if (evidencia != null) {
            this.setAsociaciones(evidencia.getAsociaciones());
        }
    }

    private Controlador getControlador() {
        return this.controlador;
    }
    

    private final Observador observadorModelo = new Observador() {

        public void cambio(Observable entidad) {

            TableModelAsociaciones.this.cargar();
            TableModelAsociaciones.this.fireTableDataChanged();
        }
    };
}
